package d5_homework;

import java.io.*;
import java.util.Scanner;

public class SecondQuestion {
    //1、定义一个变量记住该文件夹的路径-->路径只有一个,使用常量记忆
    public static final String SONG = "D:\\javadevelop\\黄埔班很重要2024\\5-" +
            "黄埔班JavaSE进阶阶段资料-徐磊面" +
            "授\\2_每日学习资料\\songs";

    //2、创建一个扫描器,可能有多处要进行使用 -->使用静态变量即可
    public static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        //目标: 掌握java中字节流和File对象的基本使用
        //1、调用方法,开始系统
        try {
            start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //1、控制界面-->独立功能独立成方法
    public static void start() throws Exception {
        while (true) {
            //1.1提示用户进行操作步骤
            System.out.println("===============欢迎来到歌曲文件夹操作器===============");
            System.out.println("1: 查询所有歌曲");
            System.out.println("2: 根据歌曲名称复制");
            System.out.println("3: 根据歌曲名称删除");
            System.out.println("4: 退出");
            System.out.println("请输出您的命令: 注意值命令是数组,不要乱输入");
            //接受用输入的数据
            int numberCommand = sc.nextInt();//注意最后是用字符串,这样子容错比较好
            //1.2进行卫语句进行拦截
            //不可以使用'0' ,int就应该是用int的进行比较,''与''比较
            if (numberCommand < 1 || numberCommand > 4) {
                System.out.println("您输入的命令有误,请您重新输入");
                continue;
            }
            //1.3使用switch-case语句进行识别用户的命令-->注意能执行到这一步,就证明,命令是正确的
            switch (numberCommand) {
                //1.4 :查询所有歌曲(注意:独立功能独立成方法)
                case 1:
                    showAllSongs(new File(SONG));
                    break;//这只是跳出了,switch
                //1.5: 根据歌曲名称复制
                case 2:
                    copyAccordingToTheSongTitle(new File(SONG));
                    break;//不写会有穿透
                //1.6:根据歌曲名称删除
                case 3:
                    deleteAccordingToSongTitle(new File(SONG));
                    break;
                //1.7:最后退出系统
                case 4:
                    return;
            }

        }
    }

    //4、根据歌曲的名称删除歌曲
    private static void deleteAccordingToSongTitle(File file) {
        //提示当前是什么功能
        System.out.println("==================欢迎使用:查询所有歌曲功能,下面是所有歌曲的信息=======================");
        //4.1还是做极端判断
        if (file == null || !file.exists()) {
            return;
        }
        //4.2提示用户输入要删除的歌曲名称
        System.out.println("请您输入要删除的歌曲名称");
        //接受用户输入的歌曲名称
        String songName = sc.next();
        //4.3判断歌曲是否存在
        if (songExists(songName, file) == null){
            //卫语句层层拦截
            //提示用户歌曲是不存在的
            System.out.println("您要删除的歌曲是不存在的,无法进行删除");
            return;
        }
        //4.4开始删除歌曲
        //4.5获取所有的一级文件对象
        File[] files = file.listFiles();
        //4.6遍历所有的一级文件对象
        for (File file1 : files) {
            //判断是文件还是文件夹
            if (file1.isFile()){
                //判断是不是要寻找的文件
                if (file1.getName().equals(songName+".txt")){
                    System.out.println(file1.getName());//注意是包括后缀名
                    System.out.println("删除成功");
                    //直接干掉文件
                    file1.delete();//注意是不进入回收站,不要乱整
                }
            }
            //是文件夹,就进行递归操作
            if (file1.isDirectory()){
                deleteAccordingToSongTitle(file1);
            }
        }
    }


    //3、根据歌曲名称进行复制
    private static void copyAccordingToTheSongTitle(File file) throws Exception {
        //提示当前是什么功能
        System.out.println("==================欢迎使用:歌曲复制功能,请您按照提示操作=======================");
        //3.1還是做极端判断
        if (!file.exists() || file == null) {
            System.out.println("文件夹路径不存在");
            //干掉方法
            return;
        }
        //3.2提示用户要输入复制的歌曲的名称
        System.out.println("请输入您要复制的歌曲名称");
        //接受用户输入的歌曲
        String songName = sc.next();
        //3.3判断歌曲是否存在,存在才进行复制(很多地方都要使用到这一步,独立成方法)
        File file1 = songExists(songName, file);
        if (file1 == null) {
            //3.4提示用户歌曲不存在,结束方法
            System.out.println("您要复制的歌曲不存在,无法进行复制");
            return;
        }


        //3.5开始复制
        //3.5.1创建一个文件字节输入流管道与源文件接通
        InputStream fis = new FileInputStream(file1);//使用多态进行书写
        //3.6.2准备一个字节数组进行读取
        byte[] buffer = new byte[1024];

        //3.6.3到这里就要提示用户进行输入,位置
        System.out.println("请您输入要复制到的位置");
        //3.6.4接受用户输入的位置
        String copyDesc = sc.next();
        //3.6.5创建复制到的文件位置
        File file2 = new File(copyDesc);
        //判断是否文件是否存在
        if (!file2.exists()) {
            //进行创建
            file2.mkdirs();
        }
        //创建该复制的文件路径(包含文件名称)

        //3.7创建一个字节输出流管道与源文件接通
        OutputStream fos = new FileOutputStream(new File(file2, songName));

        //3.8用循环进行复制
        int len;//记录读取到的字节个数
        while ((len = fis.read(buffer)) != -1) {
            //进行读多少倒多少
            fos.write(buffer, 0, len);
        }

        System.out.println("恭喜您复制成功");
    }

    //4、判断歌曲是否存在
    private static File songExists(String songName, File file) {
        //4.1获取所有的一级文件对象
        File[] files = file.listFiles();
        //进行卫语句拦截
        if (files == null || files.length == 0) {
            //直接干掉方法
            System.out.println("您没有权限,进行操作此文件夹");
            return null;
        }

        //4.2遍历所有的一级文件对象
        for (File file1 : files) {
            //4.3判断是否文件还是文件夹
            if (file1.isFile()) {
                //4.4记性是否是要寻找的歌曲
                if (file1.getName().contains(songName)) {
                    return file1.getAbsoluteFile();
                }
            } else {
                //是文件夹,进行递归
                songExists(songName, file1);
            }
        }
        //最后还是没有找到就返回
        return null;
    }

    //2、查询查询所有的歌曲
    public static void showAllSongs(File songsDirectory) {

        //提示当前是什么功能
        System.out.println("==================欢迎使用:查询所有歌曲功能,下面是所有歌曲的信息=======================");
        //2.1 创建File对象代表文件夹


        //2.2 进行卫语句判断
        if (songsDirectory == null || !songsDirectory.exists()) {
            //全当做,路径是不存在
            System.out.println("路径不存在, 系统有误,不用操作了,其余都是徒劳");
            return;
        }

        //2.3获取当前文件夹下的所有一级文件对象
        File[] files = songsDirectory.listFiles();

        //2.4做极端判断-->(1)是空文件夹 (2)没有权限进行访问文件夹
        if (files == null) {
            System.out.println("您没有权限访问当前文件夹,回家洗洗睡吧");
            //直接干掉方法
            return;
        }
        //再做空文件夹判断
        if (files.length == 0) {
            System.out.println("当前是一个空文件夹,没有然和信息,没法进行查询");
            //直接干掉方法
            return;
        }

        //到这里就可以展示所有的歌曲了
        //2.5 遍历所有的一级文件对象
        for (File file : files) {
            //2.6判断是文件还是文件夹
            if (file.isFile()) {
                //2.6.是文件,直接展示文件名
                System.out.println(file.getName());
            }
            //是文件夹的情况
            if (file.isDirectory()) {
                //2.6.2是文件夹,进行递归查询
                showAllSongs(file);
            }
        }
    }

}
